"""
观察者模式使用示例
演示如何使用EventManager和自定义事件监听器
"""
from patterns.observer import (
    EventManager, Event, EventType, EventListener
)
from datetime import datetime


# ==================== 基本事件发布和监听示例 ====================

def basic_event_example():
    """基本事件发布和订阅示例"""
    
    # 创建事件管理器（单例）
    event_manager = EventManager()
    
    # 定义一个简单的监听器
    class SimpleListener(EventListener):
        def handle(self, event: Event):
            print(f"📢 收到事件: {event.event_type.value}")
            print(f"   用户ID: {event.user_id}")
            print(f"   时间: {event.timestamp}")
            print(f"   数据: {event.data}")
        
        def get_listener_name(self):
            return "SimpleListener"
    
    # 订阅事件
    listener = SimpleListener()
    event_manager.subscribe(EventType.USER_REGISTERED, listener)
    
    # 发布事件
    event = Event(
        event_type=EventType.USER_REGISTERED,
        data={'user': {'id': 1, 'username': 'testuser'}},
        user_id=1
    )
    
    event_manager.publish(event)


# ==================== 多个监听器示例 ====================

def multiple_listeners_example():
    """多个监听器监听同一事件示例"""
    
    event_manager = EventManager()
    
    # 定义多个监听器
    class EmailNotificationListener(EventListener):
        def handle(self, event: Event):
            user = event.data.get('user')
            print(f"📧 [邮件通知] 发送欢迎邮件给: {user.get('username')}")
        
        def get_listener_name(self):
            return "EmailNotificationListener"
    
    class SMSNotificationListener(EventListener):
        def handle(self, event: Event):
            user = event.data.get('user')
            print(f"📱 [短信通知] 发送欢迎短信给: {user.get('username')}")
        
        def get_listener_name(self):
            return "SMSNotificationListener"
    
    class UserAnalyticsListener(EventListener):
        def handle(self, event: Event):
            user = event.data.get('user')
            print(f"📊 [数据分析] 记录新用户注册: {user.get('username')}")
        
        def get_listener_name(self):
            return "UserAnalyticsListener"
    
    # 订阅事件
    event_manager.subscribe(EventType.USER_REGISTERED, EmailNotificationListener())
    event_manager.subscribe(EventType.USER_REGISTERED, SMSNotificationListener())
    event_manager.subscribe(EventType.USER_REGISTERED, UserAnalyticsListener())
    
    # 发布事件（所有监听器都会收到）
    event = Event(
        event_type=EventType.USER_REGISTERED,
        data={'user': {'id': 1, 'username': 'newuser', 'phone': '13800138000'}},
        user_id=1
    )
    
    print("发布用户注册事件...")
    event_manager.publish(event)


# ==================== 条件监听器示例 ====================

def conditional_listener_example():
    """条件监听器示例 - 只处理特定条件的事件"""
    
    event_manager = EventManager()
    
    # 定义一个只处理VIP用户事件的监听器
    class VIPUserListener(EventListener):
        def handle(self, event: Event):
            user = event.data.get('user')
            print(f"👑 [VIP服务] 为VIP用户 {user.get('username')} 提供专属服务")
        
        def get_listener_name(self):
            return "VIPUserListener"
        
        def can_handle(self, event: Event):
            # 只处理VIP用户的事件
            user = event.data.get('user', {})
            return user.get('is_vip', False)
    
    # 订阅事件
    event_manager.subscribe(EventType.USER_LOGIN, VIPUserListener())
    
    # 发布普通用户登录事件（不会触发监听器）
    print("\n1. 普通用户登录:")
    event1 = Event(
        event_type=EventType.USER_LOGIN,
        data={'user': {'id': 1, 'username': 'normaluser', 'is_vip': False}},
        user_id=1
    )
    event_manager.publish(event1)
    
    # 发布VIP用户登录事件（会触发监听器）
    print("\n2. VIP用户登录:")
    event2 = Event(
        event_type=EventType.USER_LOGIN,
        data={'user': {'id': 2, 'username': 'vipuser', 'is_vip': True}},
        user_id=2
    )
    event_manager.publish(event2)


# ==================== 实际业务场景示例 ====================

def content_publish_workflow_example():
    """内容发布工作流示例"""
    
    event_manager = EventManager()
    
    # 模拟内容审核监听器
    class ContentModerationListener(EventListener):
        def handle(self, event: Event):
            content = event.data.get('content')
            print(f"🔍 [内容审核] 开始审核内容: {content.get('title')}")
            # 这里可以调用AI内容审核服务
            print(f"✅ [内容审核] 审核通过")
        
        def get_listener_name(self):
            return "ContentModerationListener"
    
    # 模拟搜索索引更新监听器
    class SearchIndexListener(EventListener):
        def handle(self, event: Event):
            content = event.data.get('content')
            print(f"🔎 [搜索索引] 更新ES索引: {content.get('title')}")
            # 这里可以调用ES更新服务
        
        def get_listener_name(self):
            return "SearchIndexListener"
    
    # 模拟推荐系统监听器
    class RecommendationListener(EventListener):
        def handle(self, event: Event):
            content = event.data.get('content')
            user_id = event.data.get('user_id')
            print(f"🎯 [推荐系统] 将内容 {content.get('id')} 推送给相关用户")
            # 这里可以调用推荐算法
        
        def get_listener_name(self):
            return "RecommendationListener"
    
    # 订阅内容发布事件
    event_manager.subscribe(EventType.CONTENT_PUBLISHED, ContentModerationListener())
    event_manager.subscribe(EventType.CONTENT_PUBLISHED, SearchIndexListener())
    event_manager.subscribe(EventType.CONTENT_PUBLISHED, RecommendationListener())
    
    # 发布内容发布事件
    event = Event(
        event_type=EventType.CONTENT_PUBLISHED,
        data={
            'content': {
                'id': 1001,
                'title': '北京冬日穿搭分享',
                'user_id': 5,
                'tags': ['穿搭', '冬季', '北京']
            },
            'user_id': 5
        },
        user_id=5
    )
    
    print("用户发布内容...")
    event_manager.publish(event)


# ==================== 自定义事件类型示例 ====================

def custom_event_type_example():
    """自定义事件类型示例"""
    from enum import Enum
    
    # 扩展事件类型
    class CustomEventType(Enum):
        ORDER_CREATED = "order_created"
        PAYMENT_SUCCESS = "payment_success"
        SHIPMENT_SENT = "shipment_sent"
    
    event_manager = EventManager()
    
    # 注意：EventType是枚举类型，这里只是演示概念
    # 实际使用时可以在observer.py中添加新的事件类型
    
    class OrderListener(EventListener):
        def handle(self, event: Event):
            print(f"📦 [订单服务] 处理事件: {event.event_type}")
            print(f"   订单数据: {event.data}")
        
        def get_listener_name(self):
            return "OrderListener"
    
    print("提示: 要添加自定义事件类型，请在 patterns/observer.py 的 EventType 枚举中添加")


# ==================== 查看所有监听器 ====================

def list_all_listeners():
    """列出所有已注册的监听器"""
    
    event_manager = EventManager()
    
    print("\n已注册的监听器:")
    print("="*60)
    
    all_listeners = event_manager.get_listeners()
    
    if not all_listeners:
        print("暂无监听器")
        return
    
    for event_type, listeners in all_listeners.items():
        print(f"\n事件类型: {event_type.value}")
        for listener in listeners:
            print(f"  - {listener.get_listener_name()}")
    
    print("\n" + "="*60)


if __name__ == "__main__":
    print("="*60)
    print("观察者模式使用示例")
    print("="*60)
    
    print("\n1. 基本事件发布和监听:")
    print("-"*60)
    basic_event_example()
    
    print("\n2. 多个监听器监听同一事件:")
    print("-"*60)
    multiple_listeners_example()
    
    print("\n3. 条件监听器:")
    print("-"*60)
    conditional_listener_example()
    
    print("\n4. 内容发布工作流:")
    print("-"*60)
    content_publish_workflow_example()
    
    print("\n5. 查看所有监听器:")
    print("-"*60)
    list_all_listeners()
    
    print("\n" + "="*60)
    print("示例运行完成")
    print("="*60)

